import {reqAddOrUpdateShopCart,reqShopCartList,reqUpdateCartIschecked} from '@/api/index.js'
import { reqDeleteShopCart } from '../api'


const shopcart = {
    namespaced: true, // 启用命名空间
    state:{
        shopCartList: []
    },
    mutations:{
        // RECEIVE_SHOPCARTLIST
        RECEIVE_SHOPCARTLIST(state,shopCartList){
            state.shopCartList = shopCartList
        }
    },
    actions:{
        // 向数据库添加或修改购物车数据
        async addOrUpdateShopCart({commit},{skuId,skuNum}){
            // 这里传过来的 skuId和skuNum 是用对象包着的
            const result = await reqAddOrUpdateShopCart({skuId,skuNum})
            if(result.code === 200){
                return 'ok'
            }else{
                // 失败
                return Promise.reject(new Error('failed'))
            }
        },

        // 获取购物车数据   getShopCartList 
        async getShopCartList({commit}){
            const result = await reqShopCartList()
            if(result.code === 200){
                commit('RECEIVE_SHOPCARTLIST',result.data)
            }
        },
        // 数据库中修改 某个商品的勾选状态
        async updateCartIschecked({commit},{skuId,isChecked}){
            const result = await reqUpdateCartIschecked({skuId,isChecked})
            if(result.code === 200){
                return 'ok'
            }else{
                return Promise.reject(new Error('failed'))
            }
        },

        // Promise.all()   
        // 功能：批量处理多个promise对象
        // 参数：promise对象的数组
        // 返回值： 返回一个新的promise对象（只有所有的promise对象都成功 才成功，有一个失败就直接失败）

            // 新的promise对象成功的结果： 是参数promise对象数组当中每个promise对象成功的结果 组成的数组
            // 新的promise对象失败的结果: 是参数promise对象数组当中第一个失败的promise对象失败的原因

        // 修改全部勾选状态 
        // 这里如果没有加 async updateCartIscheckedAll 返回的是 Promise.all(promises) 返回的新promise
        // 添加了 async  updateCartIscheckedAll 返回的是异步函数返回的promise
        // 虽然这里天不添加async  返回的不是同一个promise  但是最终结果是一样的 
        // 这是因为 async函数返回的promise  最终成功或失败看的都是 return 的Promise.all(promises)的结果
        updateCartIscheckedAll({commit,getters,dispatch},isChecked){
            // 存放 所有promise对象结果
            let promises = []
            getters.cartInfo.cartInfoList.forEach(item =>{
                if(item.isChecked === isChecked) return  // 当前的商品已经被勾选
                let promise =  dispatch('updateCartIschecked',{skuId: item.skuId,isChecked})  // 这里的promise是当前商品的promise对象
                promises.push(promise)
            })
            // 返回最终所有的promises对象
            return Promise.all(promises)
        },
        
        // 删除某条购物车信息
        async deleteOneShopCart({commit},{skuId}){
            const result = await reqDeleteShopCart({skuId})
            if(result.code === 200){
                return 'ok'
            }else{
                return Promise.reject(new Error('failed'))
            }
        },
        // 删除选中的多条购物车信息
        deleteSomeShopCart({commit,dispatch,getters}){
            let promises = []
            getters.cartInfo.cartInfoList.forEach(item =>{
                if(!item.isChecked) return   // 当前这条购物车信息未被选中
                let promise = dispatch('deleteOneShopCart',{skuId: item.skuId})
                promises.push(promise)
            })
            // 最终返回所有的promise对象
            return Promise.all(promises)
        },
    },
    getters:{
        cartInfo(state){
            // 这里注意数据的结构
            return state.shopCartList[0] || {}
        }
    },
}

export default shopcart

